﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Globalization;

namespace UOL.PagSeguro.TestServer.UI {
    public class LinhaTabelaVendas {

        private DateTime _dataProcessamento;
        private string _codigoTransacao;
        private TipoFreteRetorno _tipoFrete;
        private string _anotacao;
        private TipoPagamento _tipoPagamento;
        private StatusTransacao _status;
        private int _parcelas;
        private VendaPagSeguro _venda;

        public DateTime DataProcessamento {
            get { return _dataProcessamento; }
        }

        public string CodigoTransacao {
            get { return _codigoTransacao; }
            set { _codigoTransacao = value; }
        }

        public TipoFreteRetorno TipoFrete {
            get { return _tipoFrete; }
            set { _tipoFrete = value; }
        }

        public double ValorFrete {
            get {
                double freteTotal = 0;
                for (int i = 0; i < this._venda.Produtos.Count; i++) {
                    freteTotal += this._venda.Produtos[i].Frete;
                }
                return freteTotal;
            }
        }

        public string Anotacao {
            get { return _anotacao; }
            set { _anotacao = value; }
        }

        public TipoPagamento TipoPagamento {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }

        public StatusTransacao Status {
            get { return _status; }
            set { _status = value; }
        }

        public int Parcelas {
            get { return _parcelas; }
            set { _parcelas = value; }
        }

        public VendaPagSeguro Venda {
            get { return _venda; }
            set { _venda = value; }
        }

        public LinhaTabelaVendas(VendaPagSeguro venda) {
            this._venda = venda;
            this._codigoTransacao = Guid.NewGuid().ToString().ToUpper();
            this._dataProcessamento = DateTime.Now;
            this._parcelas = 1;
            this._status = StatusTransacao.AguardandoPagamento;
        }

        public override string ToString() {
            NameValueCollection nvc = new NameValueCollection();

            //Transação
            nvc.Add("TransacaoID", this.CodigoTransacao);
            nvc.Add("DataTransacao", this.DataProcessamento.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.GetCultureInfo("pt-BR")));
            nvc.Add("VendedorEmail", this.Venda.EmailCobranca);
            nvc.Add("Referencia", this.Venda.CodigoReferencia);

            switch (this.TipoFrete) {
                case TipoFreteRetorno.Sedex:
                    nvc.Add("TipoFrete", "SD");
                    break;
                case TipoFreteRetorno.PAC:
                    nvc.Add("TipoFrete", "EN");
                    break;
            }

            nvc.Add("Extras", this.Venda.Extras.ToString("0.00", CultureInfo.GetCultureInfo("pt-BR")));
            nvc.Add("Parcelas", this.Parcelas.ToString());
            nvc.Add("ValorFrete", this.ValorFrete.ToString("0.00", CultureInfo.GetCultureInfo("pt-BR")));
            nvc.Add("Anotacao", this.Anotacao);

            switch (this.TipoPagamento) {
                case TipoPagamento.PagSeguro:
                    nvc.Add("TipoPagamento", "Pagamento");
                    break;
                case TipoPagamento.CartaoCredito:
                    nvc.Add("TipoPagamento", "Cartão de Crédito");
                    break;
                case TipoPagamento.Boleto:
                    nvc.Add("TipoPagamento", "Boleto");
                    break;
                case TipoPagamento.TransferenciaOnline:
                    nvc.Add("TipoPagamento", "Pagamento Online");
                    break;
            }

            switch (this.Status) {
                case StatusTransacao.Completa:
                    nvc.Add("StatusTransacao", "Completo");
                    break;
                case StatusTransacao.AguardandoPagamento:
                    nvc.Add("StatusTransacao", "Aguardando Pagto");
                    break;
                case StatusTransacao.Aprovada:
                    nvc.Add("StatusTransacao", "Aprovado");
                    break;
                case StatusTransacao.EmAnalise:
                    nvc.Add("StatusTransacao", "Em Análise");
                    break;
                case StatusTransacao.Cancelada:
                    nvc.Add("StatusTransacao", "Cancelado");
                    break;
            }

            //Cliente
            nvc.Add("CliNome", this.Venda.Cliente.Nome);
            nvc.Add("CliEmail", this.Venda.Cliente.Email);
            nvc.Add("CliEndereco", this.Venda.Cliente.Endereco);
            nvc.Add("CliNumero", this.Venda.Cliente.Numero);
            nvc.Add("CliComplemento", this.Venda.Cliente.ComplementoEndereco);
            nvc.Add("CliBairro", this.Venda.Cliente.Bairro);
            nvc.Add("CliCidade", this.Venda.Cliente.Cidade);
            nvc.Add("CliEstado", this.Venda.Cliente.Uf);
            nvc.Add("CliCEP", Convert.ToString(this.Venda.Cliente.Cep));
            nvc.Add("CliTelefone", this.Venda.Cliente.DDD + " " + this.Venda.Cliente.Telefone);

            //Produtos
            nvc.Add("NumItens", this.Venda.Produtos.Count.ToString());
            for (int i = 1; i <= this.Venda.Produtos.Count; i++) {
                nvc.Add("ProdID_" + i, this.Venda.Produtos[i - 1].Codigo);
                nvc.Add("ProdDescricao_" + i, this.Venda.Produtos[i - 1].Descricao);
                nvc.Add("ProdValor_" + i, this.Venda.Produtos[i - 1].Valor.ToString("0.00", CultureInfo.GetCultureInfo("pt-BR")));
                nvc.Add("ProdQuantidade_" + i, this.Venda.Produtos[i - 1].Quantidade.ToString());
                nvc.Add("ProdFrete_" + i, this.Venda.Produtos[i - 1].Frete.ToString("0.00", CultureInfo.GetCultureInfo("pt-BR")));
            }

            StringBuilder sb = new StringBuilder();
            foreach (string name in nvc.AllKeys) {
                if (sb.Length >= 0) {
                    sb.Append("&");
                }
                sb.Append(name + "=" + nvc[name]);
            }
            return sb.ToString();
        }
    }
}
